package com.cencat.order.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 司机信息实体类
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_driver")
public class Driver implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 司机ID
     */
    @TableId(value = "driver_id", type = IdType.AUTO)
    private Long driverId;

    /**
     * 司机编号
     */
    @NotBlank(message = "司机编号不能为空")
    @Size(max = 50, message = "司机编号长度不能超过50个字符")
    @TableField("driver_code")
    private String driverCode;

    /**
     * 司机姓名
     */
    @NotBlank(message = "司机姓名不能为空")
    @Size(max = 50, message = "司机姓名长度不能超过50个字符")
    @TableField("driver_name")
    private String driverName;

    /**
     * 手机号码
     */
    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
    @TableField("phone")
    private String phone;

    /**
     * 身份证号
     */
    @Size(max = 18, message = "身份证号长度不能超过18个字符")
    @TableField("id_card")
    private String idCard;

    /**
     * 驾驶证号
     */
    @Size(max = 20, message = "驾驶证号长度不能超过20个字符")
    @TableField("license_number")
    private String licenseNumber;

    /**
     * 驾驶证类型
     */
    @Size(max = 10, message = "驾驶证类型长度不能超过10个字符")
    @TableField("license_type")
    private String licenseType;

    /**
     * 车牌号
     */
    @Size(max = 20, message = "车牌号长度不能超过20个字符")
    @TableField("plate_number")
    private String plateNumber;

    /**
     * 车辆类型
     */
    @Size(max = 50, message = "车辆类型长度不能超过50个字符")
    @TableField("vehicle_type")
    private String vehicleType;

    /**
     * 车辆品牌
     */
    @Size(max = 50, message = "车辆品牌长度不能超过50个字符")
    @TableField("vehicle_brand")
    private String vehicleBrand;

    /**
     * 车辆颜色
     */
    @Size(max = 20, message = "车辆颜色长度不能超过20个字符")
    @TableField("vehicle_color")
    private String vehicleColor;

    /**
     * 载重量(吨)
     */
    @DecimalMin(value = "0.0", message = "载重量不能小于0")
    @TableField("load_capacity")
    private BigDecimal loadCapacity;

    /**
     * 登录密码
     */
    @Size(max = 100, message = "密码长度不能超过100个字符")
    @TableField("password")
    private String password;

    /**
     * 头像地址
     */
    @Size(max = 200, message = "头像地址长度不能超过200个字符")
    @TableField("avatar")
    private String avatar;

    /**
     * 性别(0-女 1-男 2-未知)
     */
    @TableField("gender")
    private Integer gender;

    /**
     * 年龄
     */
    @Min(value = 18, message = "年龄不能小于18岁")
    @Max(value = 65, message = "年龄不能大于65岁")
    @TableField("age")
    private Integer age;

    /**
     * 邮箱
     */
    @Email(message = "邮箱格式不正确")
    @Size(max = 100, message = "邮箱长度不能超过100个字符")
    @TableField("email")
    private String email;

    /**
     * 地址
     */
    @Size(max = 200, message = "地址长度不能超过200个字符")
    @TableField("address")
    private String address;

    /**
     * 紧急联系人
     */
    @Size(max = 50, message = "紧急联系人长度不能超过50个字符")
    @TableField("emergency_contact")
    private String emergencyContact;

    /**
     * 紧急联系人电话
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "紧急联系人电话格式不正确")
    @TableField("emergency_phone")
    private String emergencyPhone;

    /**
     * 司机状态(0-离线 1-在线 2-忙碌 3-休息 4-故障)
     */
    @NotNull(message = "司机状态不能为空")
    @TableField("status")
    private Integer status;

    /**
     * 认证状态(0-未认证 1-认证中 2-已认证 3-认证失败)
     */
    @TableField("auth_status")
    private Integer authStatus;

    /**
     * 当前纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("current_latitude")
    private BigDecimal currentLatitude;

    /**
     * 当前经度
     */
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("current_longitude")
    private BigDecimal currentLongitude;

    /**
     * 当前地址
     */
    @Size(max = 200, message = "当前地址长度不能超过200个字符")
    @TableField("current_address")
    private String currentAddress;

    /**
     * 最后定位时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_location_time")
    private LocalDateTime lastLocationTime;

    /**
     * 评分
     */
    @DecimalMin(value = "0.0", message = "评分不能小于0")
    @DecimalMax(value = "5.0", message = "评分不能大于5")
    @TableField("rating")
    private BigDecimal rating;

    /**
     * 评价数量
     */
    @Min(value = 0, message = "评价数量不能小于0")
    @TableField("rating_count")
    private Integer ratingCount;

    /**
     * 完成订单数
     */
    @Min(value = 0, message = "完成订单数不能小于0")
    @TableField("completed_orders")
    private Integer completedOrders;

    /**
     * 总收入
     */
    @DecimalMin(value = "0.0", message = "总收入不能小于0")
    @TableField("total_income")
    private BigDecimal totalIncome;

    /**
     * 本月收入
     */
    @DecimalMin(value = "0.0", message = "本月收入不能小于0")
    @TableField("monthly_income")
    private BigDecimal monthlyIncome;

    /**
     * 工作年限
     */
    @Min(value = 0, message = "工作年限不能小于0")
    @TableField("work_years")
    private Integer workYears;

    /**
     * 是否在线(0-否 1-是)
     */
    @TableField("is_online")
    private Integer isOnline;

    /**
     * 最后登录时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_login_time")
    private LocalDateTime lastLoginTime;

    /**
     * 最后登录IP
     */
    @Size(max = 50, message = "最后登录IP长度不能超过50个字符")
    @TableField("last_login_ip")
    private String lastLoginIp;

    /**
     * 登录次数
     */
    @Min(value = 0, message = "登录次数不能小于0")
    @TableField("login_count")
    private Integer loginCount;

    /**
     * 账号状态(0-正常 1-停用 2-冻结)
     */
    @TableField("account_status")
    private Integer accountStatus;

    /**
     * 删除标志(0-存在 1-删除)
     */
    @TableLogic
    @TableField("del_flag")
    private Integer delFlag;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;

    /**
     * 创建者
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新者
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    @TableField("ext_field1")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    @TableField("ext_field2")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    @TableField("ext_field3")
    private String extField3;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;
}